関数ノードポリシー
[flow_graph.function_node_policies]
function_node
、multifunction_node
、async_node
および continue_node
は、タグクラスのセットとして表現される Policy
パラメーターで指定できます。このパラメーターはノードの実行動作に影響します。
// <oneapi/tbb/flow_graph.h> ヘッダーで定義
namespace oneapi {
namespace tbb {
namespace flow {
class queueing { /*unspecified*/ };
class rejecting { /*unspecified*/ };
class lightweight { /*unspecified*/ };
class queueing_lightweight { /*unspecified*/ };
class rejecting_lightweight { /*unspecified*/ };
} // namespace flow
} // namespace tbb
} // namespace oneapi
各ポリシークラスは、[copyconstructible] ISO C++ 標準の CopyConstructible の要件を満たしている必要があります。
キューイング
このポリシーは、入力メッセージを受け入れる動作を定義します。キューイング (queueing
) ポリシーは、すぐに処理できない入力メッセージが、処理可能になった時に処理されることを意味します。
拒否
このポリシーは、入力メッセージを受け入れる動作を定義します。拒否 (rejecting
) ポリシーは、すぐに処理できない入力メッセージがノードで受け入れられないことを意味し、それを処理するのはプレディセッサーの役割です。
軽量
このポリシーでは、ノードの実行に関わるオーバーヘッドを軽減する実装に対する拘束力にないヒントとして、ノード本体の処理にほとんど時間を要しないことを指定できます。実装が適用する最適化では、ノードとグラフの実行に影響を与えてはなりません。
ほかのポリシーと組み合わせると、軽量 (lightweight
) ポリシーは、最適化のヒントを基にほかのポリシーの動作を拡張します。この規則は、Policy
テンプレート・パラメーターのデフォルト値を持つ機能ノードに自動的に適用されます。例えば、Policy
のデフォルト値がキューイング (queueing
) である場合、Policy
値に軽量 (lightweight
) を指定するとキューイング軽量 (queueing_lightweight
) を指定するのと同等です。
ノード本体の関数呼び出し operator()
は、軽量ポリシーを有効にする場合 noexcept
でなければなりません。
例
以下は、パイプライン・トポロジーを使用したグラフに軽量 (lightweight
) ポリシーを適用する例を示します。2 番目と 3 番目のノードのボディーは小さいため、これらのノードに軽量 (lightweight
) ポリシーを適用するには妥当です。これにより、2 番目と 3 番目のノードのタスクは、スケジュールのオーバーヘッドなしで実行できます。グラフの同時呼び出しを許可するため、最初のノードには軽量 (lightweight
) ポリシーが指定されていません。
#include "oneapi/tbb/flow_graph.h"
int main() {
using namespace oneapi::tbb::flow;
graph g;
function_node< int, int > add( g, unlimited, [](const int &v) {
return v+1;
} );
function_node< int, int, lightweight > multiply( g, unlimited, [](const int &v) noexcept {
return v*2;
} );
function_node< int, int, lightweight > cube( g, unlimited, [](const int &v) noexcept {
return v*v*v;
} );
make_edge(add, multiply);
make_edge(multiply, cube);
for(int i = 1; i <= 10; ++i)
add.try_put(i);
g.wait_for_all();
return 0;
}